﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ASPNETVN.PORTAL;
using ASPNETVN.PORTAL.Components.Share;
using ASPNETVN.PORTAL.Components.Configuration;
using ASPNETVN.PORTAL.Components.UI;
using ASPNETVN.PORTAL.Components.Configuration.Settings;
using ASPNETVN.PORTAL.Components.UI.DataTypes;
using ASPNETVN.PORTAL.Components.Security;
using ASPNETVN.PORTAL.Components.Helpers;
using System.Collections;
using HtmlAgilityPack;
using System.Text;
using ASPNETVN.PORTAL.Modules.CMS.Components;

namespace ThoiTiet.Modules.GetNewsAutomatically
{
    public partial class Main : PortalModuleControl
    {
        private HtmlWeb hw = new HtmlWeb();
        private HtmlDocument doc = new HtmlDocument();
        private HtmlNodeCollection nc;        
        private DataRow row = null;
        private HtmlNode n = null;        

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                lblResult.Visible = false;
                lblResult.Text = "";
            }
        }

        protected void btnGetNews_Click(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Stt", typeof(System.String));
            dt.Columns.Add("UpdateDate", typeof(System.String));
            dt.Columns.Add("Title", typeof(System.String));
            dt.Columns.Add("url", typeof(System.String));
            dt.Columns.Add("process", typeof(System.String));

            switch (ddlCategory.SelectedValue)
            {
                case "1": //Tin tức - chuyên đề                    
                    GetNews("website/vi-VN/69/1/Default.aspx", "tieude_tintuc", "tieude_tintuc_list", ref dt, true);
                    break;
                case "2": //Dự báo thủy văn - Dự báo hạn ngắn                    
                    GetNews("website/vi-VN/69/18/Default.aspx", "tieude_tintuc", "tieude_tintuc_list", ref dt, true);
                    break;
                case "3": //Dự báo thủy văn - Dự báo hạn vừa                   
                    GetNews("website/vi-VN/78/21/Default.aspx", "tieude_tintuc", "tieude_tintuc_list", ref dt, false);
                    break;
                case "4": //Dự báo thủy văn - Dự báo tháng                   
                    GetNews("website/vi-VN/69/58/Default.aspx", "tieude_tintuc", "tieude_tintuc_list", ref dt, true);
                    break;
                case "5": //Dự báo thủy văn - Dự báo mùa                
                    GetNews("website/vi-VN/69/22/Default.aspx", "tieude_tintuc", "tieude_tintuc_list", ref dt, true);
                    break;
                case "6": //Phổ biến kiến thức
                    Get20News("website/vi-VN/69/26/Default.aspx", ref dt);
                    break;
            }

            DataSet ds = new DataSet();
            //kiểm tra dữ liệu đã được lấy chưa?
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                ds = Item.GetItemsByTitle(dt.Rows[i]["Title"].ToString());
                if (ds.Tables[0].Rows.Count > 0)
                    dt.Rows[i]["process"] = "Đã lấy tin";
                else
                    dt.Rows[i]["process"] = "Chưa lấy tin";
            }

            lblResult.Visible = true;
            lblResult.Text = "Danh sách bài tin (" + dt.Rows.Count + " bài tin):";
            GridDataBinding(dt);
            Cache.Remove("dtListNews");
            Cache.Insert("dtListNews", dt, null, DateTime.Now.AddMinutes(30), TimeSpan.Zero);
        }

        private string strReplace(string str)
        {
            str = str.ToString().Replace("\r", "");
            str = str.ToString().Replace("\t", "");
            str = str.ToString().Replace("\n", "");
            return str;
        }

        private void GetNews(string url, string firstNameClass, string listNameClass, ref DataTable dt, Boolean multiNews)
        {
            lblInfo.Text = "";
            int stt = 1;
            try
            {
                if (multiNews)
                {
                    doc = hw.Load("http://www.nchmf.gov.vn/" + url);
                    HtmlNode n = doc.DocumentNode.SelectSingleNode("//*[@class='" + firstNameClass + "']");
                    row = dt.NewRow();
                    if (n.NextSibling != null)
                    {
                        row["UpdateDate"] = n.NextSibling.InnerText;
                        row["UpdateDate"] = row["UpdateDate"].ToString().Substring(13, row["UpdateDate"].ToString().Length - 14);
                    }

                    //Lay url cua bai tin dau tien
                    doc = hw.Load("http://www.nchmf.gov.vn/" + n.Attributes["href"].Value);
                    row["url"] = n.Attributes["href"].Value;
                    n = doc.DocumentNode.SelectSingleNode("//td[@class='TitleNews_Special']");
                    row["stt"] = stt;
                    row["Title"] = strReplace(HttpUtility.HtmlDecode(n.InnerText));
                    dt.Rows.Add(row);

                    do
                    {
                        if (stt + 1 > int.Parse(txtCount.Text)) break;
                        nc = doc.DocumentNode.SelectNodes("//a[@class='" + listNameClass + "']");
                        if (nc == null) break;
                        for (int i = 0; i < nc.Count; i++)
                        {
                            if (stt + 1 > int.Parse(txtCount.Text)) break;
                            row = dt.NewRow();
                            if (nc[i].NextSibling != null)
                            {
                                row["UpdateDate"] = nc[i].NextSibling.InnerText;
                                row["UpdateDate"] = row["UpdateDate"].ToString().Substring(13, row["UpdateDate"].ToString().Length - 14);
                            }
                            row["stt"] = ++stt;
                            row["Title"] = strReplace(HttpUtility.HtmlDecode(nc[i].InnerText));
                            row["url"] = nc[i].Attributes["href"].Value;
                            dt.Rows.Add(row);
                        }
                        url = nc[nc.Count - 1].Attributes["href"].Value;
                        doc = hw.Load("http://www.nchmf.gov.vn/" + url);
                    }
                    while (true);
                }
                else
                {
                    doc = hw.Load("http://www.nchmf.gov.vn/" + url);
                    row = dt.NewRow();
                    row["stt"] = 1;
                    row["Title"] = strReplace(doc.DocumentNode.SelectSingleNode("//td[@class='TitleNews_Special']").InnerHtml);
                    row["url"] = url;
                    row["UpdateDate"] = DateTime.Now.ToString();
                    dt.Rows.Add(row);
                }
            }
            catch (Exception ex)
            {
                lblInfo.Text = "Không lấy được thông tin!";
            }        
        }

        private void Get20News(string url, ref DataTable dt)
        {
            lblInfo.Text = "";
            try
            {
                int stt = 0;
                doc = hw.Load("http://www.nchmf.gov.vn/" + url);
                nc = doc.DocumentNode.SelectNodes("//*[@class='tieude_tintuc']");
                for (int i = 0; i < nc.Count; i++)
                {
                    if (stt + 1 > int.Parse(txtCount.Text)) break;                    
                    if (nc[i].NextSibling != null)
                    {
                        row = dt.NewRow();                    
                        row["stt"] = ++stt;
                        row["UpdateDate"] = nc[i].NextSibling.InnerText;
                        row["UpdateDate"] = row["UpdateDate"].ToString().Substring(13, row["UpdateDate"].ToString().Length - 14);
                        row["Title"] = strReplace(HttpUtility.HtmlDecode(nc[i].InnerText));
                        row["url"] = nc[i].Attributes["href"].Value;
                        dt.Rows.Add(row);
                    }
                    else
                    {
                        // co anh dinh kem
                    }
                    
                }
            }
            catch (Exception ex)
            {
                lblInfo.Text = "Không lấy được thông tin!";
            } 
        }

        private void GridDataBinding( DataTable dt)
        {
            gvItem.DataSource = dt;
            gvItem.DataBind();
        }

        protected void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                lblInfo.Text = "";
                DataTable dt = (DataTable)Cache["dtListNews"];
                foreach (GridViewRow gv in gvItem.Rows)
                {
                    CheckBox selectChkBxItem = (CheckBox)gv.FindControl("selectRec");
                    if (selectChkBxItem.Checked)
                    {
                        int idx = int.Parse(((Label)gv.FindControl("ID")).Text) - 1;
                        Item item = new Item();

                        switch (ddlCategory.SelectedValue)
                        {
                            case "1": //Tin tức - chuyên đề                    
                                item.CategoryID = 128000218;
                                item.GroupID = 99;
                                break;
                            case "2": //Dự báo thủy văn - Dự báo hạn ngắn                    
                                item.CategoryID = 128000217;
                                item.GroupID = 98;
                                break;
                            case "3": //Dự báo thủy văn - Dự báo hạn vừa                  
                                item.CategoryID = 128000225;
                                item.GroupID = 100;
                                break;
                            case "4": //Dự báo thủy văn - Dự báo tháng                    
                                item.CategoryID = 128000227;
                                item.GroupID = 101;
                                break;
                            case "5": //Dự báo thủy văn - Dự báo mùa                    
                                item.CategoryID = 128000228;
                                item.GroupID = 102;
                                break;
                            case "6": //Phổ biến kiến thức
                                item.CategoryID = 128000212;
                                item.GroupID = 96;
                                break;
                        }

                        // Tiêu đề.
                        item.Title = HttpUtility.HtmlDecode(gvItem.Rows[idx].Cells[2].Text.ToString());
                        //url.
                        string url = ((Label)gvItem.Rows[idx].Cells[4].Controls[1]).Text;
                        doc = hw.Load("http://www.nchmf.gov.vn" + url);
                        n = doc.DocumentNode.SelectSingleNode("//td[@class='TitleNews_Special']");
                        if (n != null)
                        {
                            // Trích yếu nội dung.
                            n = n.ParentNode.NextSibling.NextSibling.ChildNodes[1];
                            item.SubTitle = HttpUtility.HtmlDecode(n.InnerText);
                            // Nội dung.
                            n = n.ParentNode.NextSibling.NextSibling.ChildNodes[1];
                            item.Body = HttpUtility.HtmlDecode(n.InnerHtml);
                        }
                        // Từ khóa.
                        item.Keywords = "";
                        // Tác giả.
                        item.Authors = "auto";
                        // Trạng thái.
                        item.Status = "PUBLISHED";
                        // Vị trí hiển thị.
                        item.DisplayType = "";

                        item.CreatedBy = PortalSecurity.CurrentUser.Identity.Email;
                        item.CreatedDate = DateTime.Parse(gvItem.Rows[idx].Cells[3].Text.ToString());
                        item.ApprovedDate = DateTime.Parse(gvItem.Rows[idx].Cells[3].Text.ToString());
                        item.ApprovedBy = PortalSecurity.CurrentUser.Identity.Email;
                        item.PublishedDate = DateTime.Parse(gvItem.Rows[idx].Cells[3].Text.ToString());
                        item.ExpiredDate = DateTime.MaxValue;

                        item.Insert();

                        dt.Rows[idx]["process"] = "Đã lấy tin";
                    }
                }
                Cache.Remove("dtListNews");
                Cache.Insert("dtListNews", dt, null, DateTime.Now.AddMinutes(30), TimeSpan.Zero);

                GridDataBinding(dt);
            }
            catch (Exception ex)
            {
                lblInfo.Text = "Lưu trong quá trình lưu tin!";
            }
        }

        protected void gvItem_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvItem.PageIndex = e.NewPageIndex;
            DataTable dt = (DataTable)Cache["dtListNews"];
            GridDataBinding(dt);
        }
    }
}
